import re


class StringUtils:
    """字符串处理工具类"""

    @staticmethod
    def clean_string(text):
        """清理字符串，去除多余空格、换行符和制表符

        Args:
            text: 要清理的文本

        Returns:
            str: 清理后的文本
        """
        if text is None:
            return ""

        # 转换为字符串类型
        if not isinstance(text, str):
            text = str(text)

        # 去除前后空格
        text = text.strip()

        # 替换多个连续空格为单个空格
        text = re.sub(r"\s+", " ", text)

        # 去除特殊字符
        pattern = r"[^\u4e00-\u9fa5a-zA-Z0-9.,;!?，。；！？:： ]+"
        text = re.sub(pattern, "", text)

        return text

    @staticmethod
    def standardize_string(text):
        """标准化字符串，转换为小写并清理

        Args:
            text: 要标准化的文本

        Returns:
            str: 标准化后的文本
        """
        if text is None:
            return ""

        # 转换为字符串类型
        if not isinstance(text, str):
            text = str(text)

        # 转换为小写
        text = text.lower()

        # 清理字符串
        text = StringUtils.clean_string(text)

        return text

    @staticmethod
    def extract_numbers(text):
        """从字符串中提取所有数字

        Args:
            text: 包含数字的文本

        Returns:
            list: 提取的数字列表
        """
        if text is None:
            return []

        # 转换为字符串类型
        if not isinstance(text, str):
            text = str(text)

        # 使用正则表达式提取所有数字（包括小数）
        numbers = re.findall(r"\d+\.?\d*", text)

        # 转换为数值类型
        result = []
        for num_str in numbers:
            try:
                if "." in num_str:
                    result.append(float(num_str))
                else:
                    result.append(int(num_str))
            except ValueError:
                # 如果转换失败，保留字符串形式
                result.append(num_str)

        return result

    @staticmethod
    def extract_chinese(text):
        """从字符串中提取中文字符

        Args:
            text: 包含中文的文本

        Returns:
            str: 提取的中文字符
        """
        if text is None:
            return ""

        # 转换为字符串类型
        if not isinstance(text, str):
            text = str(text)

        # 使用正则表达式提取中文字符
        chinese_chars = re.findall(r"[\u4e00-\u9fa5]+", text)

        return "".join(chinese_chars)

    @staticmethod
    def extract_english(text):
        """从字符串中提取英文字母

        Args:
            text: 包含英文的文本

        Returns:
            str: 提取的英文字母
        """
        if text is None:
            return ""

        # 转换为字符串类型
        if not isinstance(text, str):
            text = str(text)

        # 使用正则表达式提取英文字母
        english_chars = re.findall(r"[a-zA-Z]+", text)

        return "".join(english_chars)

    @staticmethod
    def is_empty(text):
        """检查字符串是否为空或只包含空白字符

        Args:
            text: 要检查的文本

        Returns:
            bool: 如果字符串为空或只包含空白字符则返回True，否则返回False
        """
        if text is None:
            return True

        # 转换为字符串类型
        if not isinstance(text, str):
            text = str(text)

        # 检查是否为空或只包含空白字符
        return len(text.strip()) == 0

    @staticmethod
    def contains_chinese(text):
        """检查字符串是否包含中文字符

        Args:
            text: 要检查的文本

        Returns:
            bool: 如果包含中文字符则返回True，否则返回False
        """
        if text is None:
            return False

        # 转换为字符串类型
        if not isinstance(text, str):
            text = str(text)

        # 检查是否包含中文字符
        return bool(re.search(r"[\u4e00-\u9fa5]", text))

    @staticmethod
    def contains_number(text):
        """检查字符串是否包含数字

        Args:
            text: 要检查的文本

        Returns:
            bool: 如果包含数字则返回True，否则返回False
        """
        if text is None:
            return False

        # 转换为字符串类型
        if not isinstance(text, str):
            text = str(text)

        # 检查是否包含数字
        return bool(re.search(r"\d", text))
